/**
 * API 错误处理工具
 */

import type { ResponseType } from "./global.type";

/**
 * 常用错误码枚举
 */
export enum ErrorCode {
    SUCCESS = 0,
    UNAUTHORIZED = 401,
    FORBIDDEN = 403,
    NOT_FOUND = 404,
    SERVER_ERROR = 500,
}

/**
 * 判断是否为 API 响应错误
 */
export const isApiResponseError = <T = unknown>(error: unknown): error is ResponseType<T> => {
    return (
        typeof error === "object" &&
        error !== null &&
        ("code" in error || "status" in error) &&
        "message" in error
    );
};

/**
 * 错误码对应的中文提示映射
 */
const ERROR_CODE_MESSAGE_MAP: Record<number, string> = {
    [ErrorCode.UNAUTHORIZED]: "登录已过期,请重新登录",
    [ErrorCode.FORBIDDEN]: "权限不足,无法访问该资源",
    [ErrorCode.NOT_FOUND]: "请求的资源不存在",
    [ErrorCode.SERVER_ERROR]: "服务器内部错误,请稍后重试",
};

/**
 * 获取错误消息（兼容多种错误类型）
 */
export const getErrorMessage = (error: unknown): string => {
    if (isApiResponseError(error)) {
        // 优先使用错误码映射表中的中文提示
        const code = error.status;
        if (code !== undefined && code in ERROR_CODE_MESSAGE_MAP) {
            return ERROR_CODE_MESSAGE_MAP[code];
        }
        // 其他错误码返回接口的错误信息
        return error.message || "请求失败";
    }
    if (error instanceof Error) {
        return error.message;
    }
    if (typeof error === "string") {
        return error;
    }
    return "未知错误";
};
